/**
 * @filename calculator.h
 * @brief 实现计算器的相关函数
 * @author Sun Zehui <sunzehui18@outlook.com>
 * @version 1.0.0
 * @date 2021-11-20
 */

#ifndef __CALCULATORH__
#define __CALCULATORH__

#include<iostream>
#include<string>
#include<stack>
#include<vector>
#include<regex>
using namespace std;

/**
 * @brief Two constant global regex pattern for regular matching
 */
extern regex re_double;
extern regex re_int;

/**
 * @brief convert 将字符串转化为数字
 *
 * @param str 
 *
 * @return double
 */
double convert(string str);

/**
 * @brief addBlank 在公式和相应的数值两边加上空格，方便读取
 *
 * @param str 要计算的表达式
 *
 * @return string
 */
string addBlank(string& str);

/**
 * @brief neg2pos 将负数转化为运算，比如(-10)=（0-10）
 *
 * @param str 要计算的表达式
 *
 * @return string
 */
string neg2pos(string& str);

/**
 * @brief trim 对公式作修改，调用了neg2pos和addBlank函数
 *
 * @param raw
 *
 * @return 返回一个字符串
 */
string trim(string raw);

/**
 * @brief checkNum 查看是否是数字，包括所有整数和浮点数
 *
 * @param str
 *
 * @return bool
 */
bool checkNum(string& str);

/**
 * @brief checkOperand 查看是否是运算符
 *
 * @param str
 *
 * @return bool
 */
bool checkOperand(string& str);

/**
 * @brief calculate 一次运算过程
 *
 * @param num_stk 数字栈ref
 * @param sym_stk 运算符栈ref
 */
void calculate(stack<double> &num_stk, stack<string> &sym_stk);

/**
 * @brief calculator 一个模拟计算器
 *
 * @param formula 给定一个经过处理的表达式串，如果合法输出其相应结果
 *
 * @return 
 */
double calculator(string formula);

/**
 * @brief simulate 模拟进行一次表达式计算
 *
 * @param formula 给定一个公式
 *
 * @return 
 */
int simulate(string formula);

#endif
